# -*- coding: utf-8 -*-

# === フレンド情報の管理用コントローラ
class Portal::FriendsController < ApplicationController
  # === フレンド一覧の表示
  def index
    @friends = current_user.friends
  end

  # === 個別フレンドの詳細表示
  def show
    @friend_requests = current_user.friend_requests
  end

  # === 新規フレンド登録依頼フォームの表示
  def new
    @target_user = User.find(params[:user_id])
  end

  # === フレンド登録依頼の処理（応答／拒絶選択）フォームの表示
  def edit
    @to_user_id   = params[:id]
    @request_code = params[:request_code]
    @friend_req = FriendRequest.where(:to_user_id => @to_user_id,
                                      :secret_code => @request_code).first
    unless @friend_req
      redirect_to "/", :notice => "フレンドリクエストが見つかりませんでした。"
    end
    @request_user = User.find(@friend_req.from_user_id)
  end

  # === 新規フレンド登録依頼の作成＆メッセージ送信
  def create
    target_user = User.find(params[:user_id])

    if FriendRequest.where(:from_user_id => current_user.id,
                           :to_user_id => target_user.id).first
      redirect_to common_user_path,
                   :notice => "既に同じフレンド登録が存在します。"
      return false
    end

    if current_user.friend?(target_user) || current_user == target_user
      redirect_to common_user_path,
                   :notice => "既に #{target_user.nick_name} さんとはフレンドです。"
      return false
    end

    friend_req = FriendRequest.new(:from_user_id => current_user.id,
                                   :to_user_id => target_user.id,
                                   :request_message => params[:request_message])
    friend_req.create_secret_code
    friend_req.save

    subject = current_user.nick_name + I18n.t("sns.friend_request.subject")
    friend_url = edit_portal_friend_url(target_user) + "?request_code=#{friend_req.secret_code}"
    body = "#{I18n.t("sns.friend_request.body")}\n#{friend_url}\n\nFriend Request Message: \n#{friend_req.request_message}"

    @message = Message.new(:subject => subject,
                           :body => body,
                           :from_user_id => current_user.id,
                           :format_type => "plain")
    unless @message.set_recipients(target_user.nick_name)
      raise "不正な宛先が指定されました。"
    end
    if @message.save
      redirect_to common_user_path,
                   :notice => "フレンド登録依頼を発行しました。"
    else
      raise "フレンド登録の発行に失敗しました。"
    end
  end

  # === フレンド登録依頼の応答処理
  # TODO: 現状特にメッセージ送信は伴っていない。メッセージ送信もあって良いかも
  #       知れない。
  def update
    to_user_id   = params[:user_id]
    request_code = params[:request_code]
    friend_req = FriendRequest.where(:to_user_id => to_user_id,
                                     :secret_code => request_code).first
    unless friend_req
      redirect_to "/", :notice => "フレンドリクエストが見つかりませんでした。"
    end

    if params[:accept] == "true"
      # TODO: ここを始め、必要箇所にトランザクションを当てること
      to_user = User.find(friend_req.to_user_id)
      from_user = User.find(friend_req.from_user_id)
      to_user.make_friend(from_user)
      friend_req.destroy
      redirect_to portal_friends_path,
                   :notice => "フレンド登録が完了しました。"
    else
      friend_req.destroy
      redirect_to portal_friends_path,
                   :notice => "フレンド登録に失敗しました。"
    end
  end

  # === フレンド登録状態の解除実行
  def destroy
    friend = User.find(params[:id])
    current_user.friends.delete(friend)
    redirect_to portal_friends_path,
                 :notice => "フレンド登録を解除しました。"
  end
end
